package icontrolv2

import org.springframework.dao.DataIntegrityViolationException
import grails.converters.deep.JSON
import java.util.Date;

class ProyectoController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index() {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [proyectoInstanceList: Proyecto.list(params), proyectoInstanceTotal: Proyecto.count()]
    }

    def create() {
        [proyectoInstance: new Proyecto(params)]
    }

    def save() {
        def proyectoInstance = new Proyecto(params)
        proyectoInstance.dueno = Usuario.get(session['usuario'].id)
        proyectoInstance.setEstado(Estado.get(1))
        
        if (!proyectoInstance.save(flush: true)) {
            render(view: "create", model: [proyectoInstance: proyectoInstance])
            return
        }

		flash.message = message(code: 'default.created.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), proyectoInstance.id])
        redirect(action: "show", id: proyectoInstance.id)
    }

    def show() {
        def proyectoInstance = Proyecto.get(params.id)
        def stringGrafico = mostrarGraficoTareas(proyectoInstance.id)
        
        if (!proyectoInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "list")
            return
        }

        [proyectoInstance: proyectoInstance, stringGrafico:stringGrafico]
    }

    def edit() {
        def proyectoInstance = Proyecto.get(params.id)
        if (!proyectoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "list")
            return
        }

        [proyectoInstance: proyectoInstance]
    }

    def update() {
        def proyectoInstance = Proyecto.get(params.id)
        if (!proyectoInstance) {
            flash.message = message(code: 'default.not.found.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "list")
            return
        }

        if (params.version) {
            def version = params.version.toLong()
            if (proyectoInstance.version > version) {
                proyectoInstance.errors.rejectValue("version", "default.optimistic.locking.failure",
                          [message(code: 'proyecto.label', default: 'Proyecto')] as Object[],
                          "Another user has updated this Proyecto while you were editing")
                render(view: "edit", model: [proyectoInstance: proyectoInstance])
                return
            }
        }

        proyectoInstance.properties = params

        if (!proyectoInstance.save(flush: true)) {
            render(view: "edit", model: [proyectoInstance: proyectoInstance])
            return
        }

		flash.message = message(code: 'default.updated.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), proyectoInstance.id])
        redirect(action: "show", id: proyectoInstance.id)
    }

    def delete() {
        def proyectoInstance = Proyecto.get(params.id)
        if (!proyectoInstance) {
			flash.message = message(code: 'default.not.found.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "list")
            return
        }

        try {
            proyectoInstance.delete(flush: true)
			flash.message = message(code: 'default.deleted.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "list")
        }
        catch (DataIntegrityViolationException e) {
			flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'proyecto.label', default: 'Proyecto'), params.id])
            redirect(action: "show", id: params.id)
        }
    }
    
    def mostrarGraficoTareas(proyectoId){
        def fechaActual = new Date()
        def tareas = Tarea.withCriteria {
            proyecto {
                eq('id', proyectoId)
            }
        }
        
        int dentroFecha = 0;
        int fueraFecha = 0;
        
        for(int i = 0;i < tareas.size();i ++){
            if(tareas[i].fechaTermino < fechaActual && tareas[i].estado.id != 4){
                fueraFecha ++;
            }else{
                dentroFecha ++;
            }
        }
        
        String[][] arrData = new String[2][3]
        
        arrData[0][0] = "Tareas fuera de Plazo"
        arrData[1][0] = "Tareas dentro de Plazo"
        	
        //Store sales data
        arrData[0][1] = fueraFecha
        arrData[1][1] = dentroFecha
        
        arrData[0][2] = "ff0000"
        arrData[1][2] = "00ff00"
        
        //Store Name of Products
        arrData[0][0] = "Tareas fuera de Plazo"
        arrData[1][0] = "Tareas dentro de Plazo"
        	
        //Store sales data
        arrData[0][1] = fueraFecha
        arrData[1][1] = dentroFecha
        
        arrData[0][2] = "ff0000"
        arrData[1][2] = "00ff00"

	//Now, we need to convert this data into XML. We convert using string concatenation.
	String strXML;
        int i=0;
        //Initialize <chart> element
        strXML = "<chart caption='Información sobre Tareas' bgColor='FFFFFF'>"
        //Convert data to XML and append
        for(i=0;i<arrData.length;i++){
            strXML = strXML + "<set label='" + arrData[i][0] + "' value='" + arrData[i][1] + "' color='" + arrData[i][2] + "' />";
        }
        //Close <chart> element
    	strXML = strXML + "</chart>";
	
	//Create the chart - Column 3D Chart with data contained in strXML
        
        return strXML
    }
    
    def mostrarGraficoGantt(Long idProyecto){
        def fechaActual = new Date()
        def tareas = Tarea.withCriteria {
            proyecto {
                eq('id', idProyecto)
            }
        }
        
        String[][] arrData = new String[2][3]
        
        //Now, we need to convert this data into XML. We convert using string concatenation.
	String strXML;
        int i=0;
        //Initialize <chart> element
        strXML = "<chart caption='Carta Gant Proyecto'>"
        //Convert data to XML and append
        for(i=0;i<arrData.length;i++){
            strXML = strXML + "<set label='" + arrData[i][0] + "' value='" + arrData[i][1] + "' color='" + arrData[i][2] + "' />";
        }
        //Close <chart> element
    	strXML = strXML + "</chart>";
	
	//Create the chart - Column 3D Chart with data contained in strXML
        
        return strXML
    }
    
    def adjuntarArchivo() {
        //println params.proyecto_id
        def proyectoInstance = Proyecto.get(params.proyecto_id)
        def archivoBD = new Archivo()
        def archivo = request.getFile("ruta_archivo")
        String nombreOriginal = archivo.getOriginalFilename().replace(" ", "_")
        //println servletContext.getRealPath("/")
        
        archivoBD.nombre = proyectoInstance.id + "_" + nombreOriginal
        archivoBD.descripcion = "descripcion de prueba"
        archivoBD.mime = archivo.getContentType()
        archivoBD.proyecto = proyectoInstance
        
        if(archivoBD.save(flush: true)) {
            archivo.transferTo(new File(servletContext.getRealPath("/") + "archivos/" + archivoBD.nombre))
        }else {
            flash.errorAdjuntar = "Ha ocurrido un error al adjuntar el archivo, intente nuevamente"
        }
        
        redirect(action: "show", id: proyectoInstance.id)
    }
    
    def agregarTag() {
        if(request.post) {
            def proyecto                = Proyecto.get(params.proyecto)
            def tag                     = new Tag()
            tag.setNombre(params.nombre)
            tag.proyecto = proyecto
            
            if(tag.save(flush: true)) {
                flash.mensajeExito = "El tag se a grabado correctamente"
                redirect(action: "show", id: proyecto.id)
            }else {
                flash.mensajeError = "Ha ocurrido un error al grabar el tag, intente nuevamente"
                redirect(action: "show", id: proyecto.id)
            }
        }
    }
    
    def facturar() {
        def proyecto = Proyecto.get(params.proyectoId)
        Date date = new Date();
        String fecha = date.getDay() + "/" + date.getMonth() + "/13";
        
        System.out.println(proyecto)
        def facturacion = new FacturacionService("C:\\Facturacion\\Pruebas.txt", proyecto.getId(), fecha, proyecto.cliente.getRut() + "-" + proyecto.cliente.getDv(), proyecto.cliente.getNombre(), "Apellido Cliente", "M", 27, 12345678);
        facturacion.escribirArchivo();
    }
}
